It is quite common for a system to be designed to include a microprocessor connected directly or indirectly to a bus for auxiliary cards. Typical examples include NuBus devices connected to Motorola 68 k or Motorola or IBM PowerPC microprocessors and ISA bus devices connected to Intel or other x86 microprocessors. Such devices have been used in personal computers since at least about 1983. Recent computers have made increasing use of the PCI bus in combination with a number of different microprocessors. Millions of computers are made each year using the PCI bus.
Design of PCI-based computer systems is described in many documents including, for example, the PCI Local Bus 2.1 specification, PCI Special Interest Group, Jun. 1, 1995 (PO Box 14070, Portland OR 97214). Representative designs and techniques are well known in the art.
By far and away, the most common architecture of a PCI computer system uses a single microprocessor connected to a memory controller and memory and to one or more PCI bridge devices. Each PCI bridge device is typically connected to a local PCI bus with a plurality of PCI slots, often three or more. Devices in these slots can communicate between themselves on the local PCI bus and can communicate with main memory and/or with the microprocessor and other system functions through the PCI bridge chip. System I/O devices such as keyboard, monitor, and disk storage may be connected variously on the processor side or on the PCI side of the bridge chip. Communication between a first PCI device on a first PCI local bus and a second PCI device on a second PCI local bus, not directly connected to the first, can be managed through each bus's respective bridge chips. PCI buses can be arranged in hierarchies as well by inserting a PCI to PCI bridge chip on a first PCI local bus to provide a branch or leaf PCI bus as an adjunct to the first PCI local bus. Such architectures and the manufacture of appropriate bridge chips are well understood in the art.
Part of the initialization sequence of a PCI-based computer involves testing each PCI device installed in the system and allocating a certain address space. Any device in the system that has need to communicate with a given PCI device need only direct instructions to the address space for that device. The initialization sequence is described in more detail in the PCI specification, esp. Chapter 6.
Some systems have been designed with multiple microprocessors. Examples include the Macintosh 9500/180 MP, with two PowerPC processors from Apple Computer (Cupertino, Calif.), and similar offerings from Daystar (Atlanta, Ga.) and Umax (Taiwan). Computers with multiple x86, particularly Pentium Pro, microprocessors are available from other vendors. Taking for example the Apple 9500/180 MP, each of the two microprocessors are connected to have access to the system bus and main memory. Any interaction between either microprocessor and a PCI device must flow through the system bus and an appropriate PCI bridge, and PCI local bus.
Another, much less common, design using multiprocessors is to provide a coprocessor of some sort. While special purpose chips such as DSP or special rendering engines are often included as coprocessors, such devices or usually designed into the main architecture of the computer system or included as cards that can be inserted into the bus, e.g. as a PCI device, and share access with the computer system as would any other PCI device.
Still less common are devices which include a separate microprocessor, to some extent independent of the primary microprocessor. A common form of such a device is a sub-computer, often built on a single card, which includes a microprocessor, memory control, I/O control and bus control as appropriate for the card-microprocessor such that the card-microprocessor is able to function essentially independently of the primary system microprocessor. For example, Apple Computer, Cupertino, Calif., has sold a "DOS Compatibility Card" since about 1994, a card including an x86 or compatible microprocessor and sufficient support chips to allow the x86 to function in a system which is built around a Motorola 680x0 or a PowerPC microprocessor. Early cards were designed to connect to the main system bus with a variety of schemes to share certain system elements, such as keyboard, mouse, display, storage devices and to some extent main memory.
Apple's newest PC Compatibility Cards are built as PCI card devices, to plug into a PCI slot and to interact with primary system resources and, to the extent needed, the main processor, through PCI protocols. However, the PC side of the card has its own PCI bus. This leads to an interesting problem in initializing the overall computer system. When the PowerPC side initializes, each PCI device is examined so appropriate memory spaced can be allocated. When the PC side initializes, it needs to do exactly the same thing. It is preferred that no memory addresses be assigned in these various PCI buses which are in conflict with each other. However, it is undesirable to allow the host computer, the PowerPC in this embodiment, to assign addresses in the PC device's local PCI environment, particularly since the PC will try to initialize its own local PCI environment and assign its own addresses. At a minimum this is likely to require reallocation of at least some PCI addresses. At worst, this could cause some significant system thrashing as the two microprocessors try to arbitrate an addressing scheme, and could even cause the system to hang or freeze.
There is a need for some way to bring up multiple PCI environments within a single system without unnecessary steps in the boot process. This has been provided with the method and apparatus of this invention.